<?php

namespace App\Http\Controllers\api\gift;

use App\Http\Controllers\Controller;
use App\Logic\raffle\scoreRaffle;
use App\Models\Gift;
use App\Models\Raffle;
use App\Server\ApiService;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;

class GiftController extends Controller
{
    private static $count = 0;

    /**
     * Name: 抽奖商品展示
     * User: 王梓墨
     * Date: 2023/7/4
     * Time:10:00
     * @return \Illuminate\Http\JsonResponse
     */
    public function giftIndex()
    {
        $data = Gift::all()->toArray();
        return ApiService::success('获取抽奖商品成功',$data);
    }

    /**
     * Name: 积分抽奖
     * User: 王梓墨
     * Date: 2023/7/4
     * Time:15:38
     * @return \Illuminate\Http\JsonResponse
     */
    public function scoreRaffle()
    {
        //登录用户取出id
        $userId = 1;
        $counter = Cache::get('counter');
        $score = DB::table('admin')->where('id',$userId)->value('score');
        if ($score < 20)
        {
            return ApiService::fail('积分已不足一次抽奖，请坚持每天签到获取积分');
        } elseif ($counter > 20) {
            return ApiService::fail('今日抽奖次数达到上限，请明天再来');
        } else {
            $prize_arr = Gift::select('id','name','probability')->where('num','>=','0')->where('status','=','1')->get()
                ->toArray();
            /*
             * 每次前端页面的请求，PHP循环奖项设置数组，
             * 通过概率计算函数get_rand获取抽中的奖项id。
             * 将中奖奖品保存在数组$res['yes']中，
             * 而剩下的未中奖的信息保存在$res['no']中，
             * 最后输出json个数数据给前端页面。
             */
            foreach ($prize_arr as $key => $val) {
                $arr[$val['id']] = $val['probability'];
            }
            $rid = scoreRaffle::scoreRaffle($arr); //根据概率获取奖项id

            $res['yes'] = $prize_arr[$rid-1]['name']; //中奖项
            unset($prize_arr[$rid-1]); //将中奖项从数组中剔除，剩下未中奖项
            shuffle($prize_arr); //打乱数组顺序
            for($i=0;$i<count($prize_arr);$i++){
                $pr[] = $prize_arr[$i]['name'];
            }
            $res['no'] = $pr;

            try {
                //抽奖表此奖品数量--
                $giftNum = Gift::where('name',$res['yes'])->value('num');
                Gift::where('name',$res['yes'])->update([
                    'num' => $giftNum - 1
                ]);
                //积分-20
                DB::table('admin')->where('id',$userId)
                    ->update([
                        'score' => DB::table('admin')
                            ->where('id',$userId)
                            ->value('score') - 20
                    ]);
                //中奖表添加数据
                //同一用户以及同一商品
                $exists = Raffle::where('user_id',$userId)
                    ->where('name',$res['yes'])
                    ->exists();
                //如果存在，直接修改中奖数量
                if ($exists)
                {
                    Raffle::where('user_id',$userId)
                        ->where('name',$res['yes'])
                        ->update([
                            'num' => Raffle::where('user_id',$userId)
                                    ->where('name',$res['yes'])
                                    ->value('num') + 1
                        ]);
                } else {
                    Raffle::create([
                        'name' => $res['yes'],
                        'user_id' => $userId,
                        'num' => 1
                    ]);
                }

                $res['num'] = $counter;

                return ApiService::success('抽奖成功',$res);
            } catch (\Exception $e) {
                Log::info($e->getMessage());
            }
        }
    }

    /**
     * Name: 每日免费抽奖
     * User: 王梓墨
     * Date: 2023/7/4
     * Time:15:42
     * @return \Illuminate\Http\JsonResponse
     */
    public function freeRaffle()
    {
        //登录用户取出id
        $userId = 1;
        $counter = Cache::get('counter_day');
        if($counter > 4)
        {
            return ApiService::fail('今日抽奖次数达到上限，请明天再来');
        } else {
            $prize_arr = Gift::select('id','name','probability')->where('num','>=','0')->where('status','=','1')->get()
                ->toArray();
            /*
             * 每次前端页面的请求，PHP循环奖项设置数组，
             * 通过概率计算函数get_rand获取抽中的奖项id。
             * 将中奖奖品保存在数组$res['yes']中，
             * 而剩下的未中奖的信息保存在$res['no']中，
             * 最后输出json个数数据给前端页面。
             */
            foreach ($prize_arr as $key => $val) {
                $arr[$val['id']] = $val['probability'];
            }
            $rid = scoreRaffle::scoreRaffle($arr); //根据概率获取奖项id

            $res['yes'] = $prize_arr[$rid-1]['name']; //中奖项
            unset($prize_arr[$rid-1]); //将中奖项从数组中剔除，剩下未中奖项
            shuffle($prize_arr); //打乱数组顺序
            for($i=0;$i<count($prize_arr);$i++){
                $pr[] = $prize_arr[$i]['name'];
            }
            $res['no'] = $pr;

            try {
                //抽奖表此奖品数量--
                $giftNum = Gift::where('name',$res['yes'])->value('num');
                Gift::where('name',$res['yes'])->update([
                    'num' => $giftNum - 1
                ]);
                //中奖表添加数据
                //同一用户以及同一商品
                $exists = Raffle::where('user_id',$userId)
                    ->where('name',$res['yes'])
                    ->exists();
                //如果存在，直接修改中奖数量
                if ($exists)
                {
                    Raffle::where('user_id',$userId)
                        ->where('name',$res['yes'])
                        ->update([
                            'num' => Raffle::where('user_id',$userId)
                                    ->where('name',$res['yes'])
                                    ->value('num') + 1
                        ]);
                } else {
                    Raffle::create([
                        'name' => $res['yes'],
                        'user_id' => $userId,
                        'num' => 1
                    ]);
                }

                $res['num'] = $counter;

                return ApiService::success('抽奖成功',$res);
            } catch (\Exception $e) {
                Log::info($e->getMessage());
            }
        }
    }
}
